﻿using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using InvoiceInvoker.MvcUI.Helpers;
using InvoiceInvoker.Logic;

namespace InvoiceInvoker.MvcUI.Models
{
	public class CustomerModel
	{
		[ScaffoldColumn(false)]
		public int Id { get; set; }

		[ScaffoldColumn(false)]
		public int RegisteredSellerId { get; set; }

		[DisplayName("Klient")]
		public string Name
		{
			get { return CustomerName + ", " + CompanyName; }
		}

		[DisplayName("Imię i nazwisko")]
		[Required(ErrorMessage = "Podaj imię i nazwisko klienta")]
		[StringLength(100, ErrorMessage = "Imię i nazwisko może mieć co najwyżej 100 znaków")]
		public string CustomerName { get; set; }

		[DisplayName("Nazwa firmy")]
		[Required(ErrorMessage = "Podaj nazwę firmy")]
		[StringLength(50, ErrorMessage = "Nazwa firmy może mieć co najwyżej 50 znaków")]
		public string CompanyName { get; set; }

		[DisplayName("Ulica")]
		[Required(ErrorMessage = "Podaj ulicę")]
		[StringLength(50, ErrorMessage = "Ulica może mieć co najwyżej 50 znaków")]
		public string Street { get; set; }

		[DisplayName("Miasto")]
		[Required(ErrorMessage = "Podaj miasto")]
		[StringLength(50, ErrorMessage = "Miasto może mieć co najwyżej 50 znaków")]
		public string City { get; set; }

		[DisplayName("Kod pocztowy")]
		[Required(ErrorMessage = "Podaj kod pocztowy")]
		[StringLength(10, ErrorMessage = "Kod pocztowy może mieć co najwyżej 10 znaków")]
		public string PostalCode { get; set; }

		[DisplayName("NIP")]
		[Required(ErrorMessage = "Podaj NIP")]
		[StringLength(20, ErrorMessage = "NIP może mieć co najwyżej 20 znaków")]
		[CustomValidation(typeof(ValidationHelpers), "ValidateNip")]
		public string Nip { get; set; }

		[DisplayName("E-mail")]
		[StringLength(50, ErrorMessage = "E-mail może mieć co najwyżej 50 znaków")]
		public string Email { get; set; }

		[DisplayName("WWW")]
		[StringLength(50, ErrorMessage = "Adres WWW może mieć co najwyżej 50 znaków")]
		public string Www { get; set; }

		[DisplayName("Telefon")]
		[StringLength(50, ErrorMessage = "Nr telefonu może mieć co najwyżej 50 znaków")]
		public string Phone { get; set; }

		[DisplayName("Uwagi")]
		[StringLength(3000, ErrorMessage = "Uwagi mogą mieć co najwyżej 3000 znaków")]
		public string Remarks { get; set; }

		public CustomerModel()
		{ }

		public CustomerModel(int registeredSellerId)
		{
			RegisteredSellerId = registeredSellerId;
		}

		public CustomerModel(RegisteredCustomer registeredCustomer)
		{
			Id = registeredCustomer.Id;
			RegisteredSellerId = registeredCustomer.RegisteredSellerId ?? 0;
			CustomerName = registeredCustomer.CustomerName;
			CompanyName = registeredCustomer.CompanyName;
			Street = registeredCustomer.Street;
			City = registeredCustomer.City;
			PostalCode = registeredCustomer.PostalCode;
			Nip = registeredCustomer.Nip;
			Email = registeredCustomer.Email;
			Www = registeredCustomer.Www;
			Phone = registeredCustomer.Phone;
			Remarks = registeredCustomer.Remarks;
		}

		public CustomerModel(Customer customer)
		{
			Id = customer.Id;
			CustomerName = customer.CustomerName;
			CompanyName = customer.CompanyName;
			Street = customer.Street;
			City = customer.City;
			PostalCode = customer.PostalCode;
			Nip = customer.Nip;
		}

		public RegisteredCustomer ToRegisteredCustomer()
		{
			RegisteredCustomer result = new RegisteredCustomer();
			result.Id = Id;
			result.RegisteredSellerId = RegisteredSellerId;
			result.CustomerName = CustomerName;
			result.CompanyName = CompanyName;
			result.Street = Street;
			result.City = City;
			result.PostalCode = PostalCode;
			result.Nip = Nip;
			result.Email = Email;
			result.Www = Www;
			result.Phone = Phone;
			result.Remarks = Remarks;

			return result;
		}
	}
}